export default {
  // 1. cart模块可以使用命名空间
  namespaced: true,
  // 2. 定义cart存放数据的对象
  state: () => ({
    cart: JSON.parse(uni.getStorageSync("cart") || "[]"),
  }),
  // 3. 定义操作数据的方法
  mutations: {
    // 3.1 添加购物车
    addToCart(state,goods){
      // 3.2 根据商品id,查询在原来的购物车中是否有此商品,如果有则修改商品数量,如果没有则添加到购物车列表中
      const searchGoods = state.cart.find(x => x.goods_id === goods.goods_id)
      // 3.3 如果找到了商品就说明购物车中有此商品,此时只需要修改商品的数量即.
      if(searchGoods){
        searchGoods.goods_count++
      }else{ //3.4 如果没有此商品就添加此商品
        state.cart.push(goods)
      }
      console.log("购物车数据：",state.cart)
      // 3.5 添加完购物车后进行持久化保存数据
      this.commit("m_cart/saveToStorage")
    },
    // 修改商品状态
    upateGoodsState(state,goods){
      // 1. 在购物车中查询出商品对象
       const searchGoods = state.cart.find(x => x.goods_id === goods.goods_id)
       // 2. 如果有此商品就修改状态
       if(searchGoods){
         searchGoods.goods_state = goods.goods_state
       }
       // 3. 提交改变
        this.commit("m_cart/saveToStorage")
    },
    // 修改商品数量
    updateGoodsCount(state,goods){
      // 1. 在购物车查询出此商品
      const updateGoods = state.cart.find(x => x.goods_id === goods.goods_id)
      updateGoods.goods_count = goods.goods_count
      // 2. 进行持久化保存
      this.commit("m_cart/saveToStorage")
    },
    // 删除购物车商品
    removeGoodsFromCart(state,goods_id){
      // 将除了你要删除外的其它商品保留,重新放到购物车中
      state.cart = state.cart.filter(x => x.goods_id !== goods_id)
      // 最后,持久化保存
       this.commit("m_cart/saveToStorage")
    },
    // 修改所有的商品状态
    updateAllGoodsState(state,newState){
      // 1. 循环为每个商品的状态设置值
      state.cart.forEach(x => x.goods_state = newState)
      // 2. 持久化保存所有商品状态
      this.commit("m_cart/saveToStorage")
    },
    // 3.2 保存数据到storage
    saveToStorage(state){
      uni.setStorageSync("cart",JSON.stringify(state.cart))    // JSON.stringify(): 将对象转换为字符串
    }
  },
  // 4. 定义getters获取属性的方法
  getters: {
    // 4.1 统计商品总数量
    total(state){
      // 4.2 定义商品总数量
      let c = 0
      // 4.3 遍历购物车累加商品总数量
      state.cart.forEach(x => c += x.goods_count)
      // 4.4 最后,返回
      return c
    },
    // 5. 获取购物车中被复选商品的总数量
    checkedCount(state){
      return state.cart.filter(x => x.goods_state)
                       .reduce((total,item) => total += item.goods_count,0)
    },
    // 6. 计算商品总金额
    checkedGoodsAmount(state){
      return state.cart.filter(x => x.goods_state)
                       .reduce((total,item) => total += item.goods_count * item.goods_price,0)
                       .toFixed(2)
    }
  }  
}
